
import java.io.*; import java.util.*;

public class Banque implements Serializable {
	
	//Attributs
	private int numDerCompte ;  //Dernier num�ro de compte (permet de g�n�rer automatiquement les num�ros de comptes

	private HashMap<String, ClientPhysique> _clients; 
	private HashMap<Integer, ComptePerso> _comptes;

	//Constructeur
	public Banque() {
		this.setNumDerCompte(0);
		this.setClients(new HashMap<String, ClientPhysique>());
		this.setComptes(new HashMap<Integer, ComptePerso>());
	}

	//Affecteurs
	private void setNumDerCompte(int num){
		numDerCompte = num;
	}
	
	/**
	 * Ajoute un client � l'ensemble des clients de la banque.
	 * @param client 	Client � ajouter
	 * @param np 		Nom + Pr�nom de ce client
	 */
	
	
	private void setClient(ClientPhysique client, String np) {
		this.getClients().put(np, client);
	} // Fin setClient

	/**
	 * Initialise l'attribut clients � l'ensemble des clients de la banque.
	 * @param clients hashtable de clients a affecter
	 */
	private void setClients(HashMap<String, ClientPhysique> clients) {
		_clients = clients;
	}// Fin setClients
	
	/**
	 * Ajoute un compte � l'ensemble des comptes de la banque.
	 * @param compte 	Compte � ajouter
	 * @param n		Num�ro de ce compte
	 */
	private void setCompte(ComptePerso compte, Integer n) {
		this.getComptes().put(n, compte);
	} // Fin setComptes

	/**
	 * Initialise l'attribut comptes � l'ensemble des comptes de la banque.
	 * @param comptes hashtable de comptes a affecter
	 */
	private void setComptes(HashMap<Integer, ComptePerso> comptes) {
		_comptes = comptes;
	}// Fin setComptes

	// ------------------------------------------------------------------------------------------------------------
			// Accesseurs
			
			public int getNumDerCompte(){
				return numDerCompte;
			}
			/**
			 * @return ensemble des clients de la banque
			 */
			private HashMap<String, ClientPhysique> getClients() {
				return _clients;
			}// Fin getClients

			/**
			 * Acces � un client par son nom + pr�nom
			 * @param np 	le nom+prenom du client recherch�
			 * @return le client qui a le np indiqu�
			 */
			private ClientPhysique getClient(String np) {
				return this.getClients().get(np);
			} // Fin getClient

			/**
			 * @return ensemble des comptes de la banque
			 */
			private HashMap<Integer, ComptePerso> getComptes() {
				return _comptes;
			}// Fin getCompte

	/**
	* Acces � un compte par son num�ro
	* @param n 	le num�ro du compte recherch�
	* @return le compte qui a le num�ro n
	*/
	private ComptePerso getCompte(Integer n) {
				return this.getComptes().get(n);
	} // Fin getOuvrage
	private ComptePerso getComptePerso( Integer num){
		return this._comptes.get(num);
	}
			
	private int genererNumComptePerso() {
		this.setNumDerCompte(this.getNumDerCompte() + 1);
		return(this.getNumDerCompte());
	}
	
	// Traitement
	
	public void nouvClientPhysique(){
		EntreesSorties.afficherMessage("Ajout d'un client physique");	
		EntreesSorties.afficherMessage("Nom : ");
		String nom = EntreesSorties.lireChaine();
		EntreesSorties.afficherMessage("Prenom :");
		String prenom = EntreesSorties.lireChaine();
		
		if (this.getClient(nom+prenom)== null) {
		// Instanciation du client
			EntreesSorties.afficherMessage("Adresse :");
			String adresse = EntreesSorties.lireChaine();
			GregorianCalendar dn = EntreesSorties.lireDate("Date de naissance : ");
			ClientPhysique clientP = new ClientPhysique(nom, prenom, adresse, dn);
			// Ajout du client dans l'ensemble des clients de la banque
			this.setClient(clientP, nom+prenom);
			EntreesSorties.afficherMessage("Client enregistre :");
			} 
			else {
				EntreesSorties.afficherMessage("Client deja present :");
				}
	}	

	public void nouvComptePerso() {
		EntreesSorties.afficherMessage("Ajout d'un compte personnel");

		//saisie des noms et pr�noms du client
		EntreesSorties.afficherMessage("Nom du client :");
		String nom = EntreesSorties.lireChaine();

		EntreesSorties.afficherMessage("Prenom du client :");
		String prenom = EntreesSorties.lireChaine();

		//Recherche du client
		ClientPhysique clp = this.getClient(nom+prenom);
		
		if (clp == null) {
			EntreesSorties.afficherMessage("Client inexistant");
		}
		else {
			int numero = this.genererNumComptePerso();
			EntreesSorties.afficherMessage("Le numero du compte sera le :" + numero);
			EntreesSorties.afficherMessage("Type du compte :");
			String ty = EntreesSorties.lireChaine();
			EntreesSorties.afficherMessage("Solde initial :");
			int so = EntreesSorties.lireEntier();
			EntreesSorties.afficherMessage("Decouvert autorise :");
			int dec = EntreesSorties.lireEntier();
			ComptePerso cp = new ComptePerso(numero, ty, so, dec, clp);
			this.setCompte(cp, numero);
			EntreesSorties.afficherMessage("Creation du compte OK");
			}
	}
	void consulterComptePerso(){
		EntreesSorties.afficherMessage("Numero du compte a afficher? :");
		int num = EntreesSorties.lireEntier();
		ComptePerso cp = this.getComptePerso(num);
		if (cp!=null) {
			int numc = cp.getNumero();
			float s = cp.getSolde();
			int d = cp.getDecouvertAutorise();
			ClientPhysique clp = cp.getClientPhysique();
			String nomcli = clp.getNom();
			String prenomcli = clp.getPrenom();
			String adrcli = clp.getAdresse();
			GregorianCalendar dn = clp.getDateNaissance();
			EntreesSorties.afficherMessage("Infos sur le client : "+nomcli+" "+prenomcli+"Adresse : "+adrcli+"  Né le: "+EntreesSorties.ecrireDate(dn)+" ");
			
			EntreesSorties.afficherMessage("Infos sur le compte :   numéro: "+numc+"   solde: "+s+"  découvert autorisé : "+d);
		}
		else EntreesSorties.afficherMessage("Compte Inexistant ");
	}
}
